package com.carsa.blackberry.ui.screen.entregasfallidas;

import java.util.Calendar;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ObjectChoiceField;
import net.rim.device.api.ui.container.VerticalFieldManager;

import com.carsa.blackberry.MainKeys;
import com.carsa.blackberry.domain.dto.EntregaDTO;
import com.carsa.blackberry.domain.services.impl.EntregasServiceImpl;
import com.carsa.blackberry.ui.UIKeys;
import com.carsa.blackberry.ui.screen.MainMenuScreen;
import com.carsa.blackberry.ui.screen.common.BasicScreen;
import com.carsa.blackberry.util.DateUtil;
import com.carsa.blackberry.util.Logger;
import com.carsa.blackberry.util.ui.UIUtil;
import com.carsa.blackberry.util.ui.widget.GridFieldManager;

/**
 * @author Nahuel Barrios.
 * @since 20/07/2010.
 * @version 1.0
 */
public class EntregasFallidasScreen extends BasicScreen {

    private ObjectChoiceField _combo_date;

    public EntregasFallidasScreen() {
	super(UIKeys.TITLE_ENTREGAS_FALLIDAS);
	super.customizeScreen();

	// Preparo el buscador
	// TODO : Functionality : crear el buscador de fechas hasta 10dias anteriores.
	Object[] dates = new Object[1];
	dates[0] = DateUtil.exportDateAs(Calendar.getInstance().getTime(), DateUtil.DATE_ORDER_DD_MM_AAAA,
	        DateUtil.DATE_SEPARATOR_BAR);
	_combo_date = new ObjectChoiceField(UIKeys.TITLE_ENTREGAS_DEL_DIA, dates);

	VerticalFieldManager grid = null;
	try {
	    // Esto esta catcheado porque sino en modo run tira un NullPointerException si viene en cero la cantidad de
	    // entregas para mostrar
	    // pero anda bien en modo debug. Habria que probarlo en la BB a ver como anda.
	    grid = this.makeListOfEntregas();
	}
	catch (Exception e) {
	    Logger.logError(e);
	}

	// ---------------------------------------------------
	// Con todos los controles ya seteados, armo la vista.
	_mainManager.add(_combo_date);

	_mainManager.add(grid);

	_mainManager.add(UIUtil.getEmptyLine());
	super.addBackButton(_mainManager);
	this.add(_mainManager);
    }

    /**
     * @return Un {@link VerticalFieldManager} listo para agregar a la pantalla conteniendo un listado con las entregas
     *         filtradas para esta pantalla. Si no hubiera ninguna entrega para mostrar, entonces aparece un mensaje
     *         indicando que no hay nada para mostrar.
     */
    public VerticalFieldManager makeListOfEntregas() {
	VerticalFieldManager vManager = new VerticalFieldManager();

	String previousGroup = "";
	boolean flag = true;

	Vector entregas = new EntregasServiceImpl().getEntregasCalified();
	Enumeration elements = entregas.elements();
	while (elements.hasMoreElements()) {
	    EntregaDTO unaEntrega = (EntregaDTO) elements.nextElement();

	    if (unaEntrega.hasAnyArticleAsFail()) {
		flag = false;
		
		// Preparo la grilla.
		Vector data = new Vector();

		previousGroup = this.putGroupHeaderWhenNecessary(vManager, data, previousGroup, unaEntrega.getSammg());

		data.addElement(this.prepareFieldArray(unaEntrega, unaEntrega.getDirec()));

		GridFieldManager aGrid = new GridFieldManager(new int[] { 85, 196, 39 }, 0);
		aGrid = UIUtil.loadFieldGridFrom(aGrid, data);

		vManager.add(aGrid);
	    }
	}

	if (flag) {
	    vManager = new VerticalFieldManager();
	    UIUtil.addNewEmptyLine(vManager, 2);
	    vManager.add(new LabelField(UIKeys.TITLE_NO_HAY_ENTREGAS_PARA_MOSTRAR));
	    UIUtil.addNewEmptyLine(vManager, 6);
	}

	return vManager;
    }

    /**
     * @param vManager
     * @param gridData
     * @param previousGroup
     * @param currentGroup
     * @return
     */
    // TODO : Javadoc : Terminate this Javadoc.
    private String putGroupHeaderWhenNecessary(VerticalFieldManager vManager, Vector gridData, String previousGroup,
	    String currentGroup) {
	if (previousGroup.equals(currentGroup))
	    return previousGroup;

	vManager.add(UIUtil.getEmptyLine());

	Vector groupName = new Vector();
	groupName.addElement(UIKeys.FIELD_GRUPO + "\t" + currentGroup);

	vManager.add(((Field[]) UIUtil.prepareHeadersForGrid(groupName, this))[0]);

	// Preparo los headers de la tabla.
	Vector headers = new Vector();
	headers.addElement(UIKeys.TITLE_ENTREGA);
	headers.addElement(UIKeys.TITLE_CLIENT);
	headers.addElement("");
	gridData.addElement(UIUtil.prepareHeadersForGrid(headers, this));

	return currentGroup;
    }

    /**
     * Prepara el array de Field necesario para mostrar la tabla.
     * 
     * @param groupNumber
     * @param numeroEntrega
     * @param clientName
     * @return
     */
    public Field[] prepareFieldArray(final EntregaDTO unaEntrega, final String clientDirec) {

	final String fullName= unaEntrega.getName1() + ", " + unaEntrega.getName2();
	
	Field[] row = new Field[3];
	row[0] = new LabelField(unaEntrega.getVbeln(), FIELD_HCENTER | Field.NON_FOCUSABLE);
	row[1] = new LabelField(fullName, FIELD_HCENTER | Field.NON_FOCUSABLE);

	ButtonField bf_view = new ButtonField(UIKeys.TITLE_VER);
	bf_view.setFont(this.getFont().getFontFamily().getFont(Font.PLAIN, UIKeys.SIZE_FOR_LITTLE_BUTTONS_FONT));
	bf_view.setChangeListener(new FieldChangeListener() {

	    public void fieldChanged(Field field, int context) {
		Hashtable parameters = new Hashtable();
		parameters.put(MainKeys.PARAMETER_CURRENT_ENTREGA, unaEntrega);
		parameters.put(MainKeys.PARAMETER_CLIENT_NAME, fullName);
		parameters.put(MainKeys.PARAMETER_CLIENT_DIREC, clientDirec);

		UiApplication.getUiApplication().pushScreen(new DetalleEntregaFallidaScreen(parameters));
	    }

	});
	row[2] = bf_view;

	return UIUtil.setFontSize(row, UIKeys.SIZE_FOR_GRID_DATA_FONT);
    }

    /**
     * Sobreescribo la funcionalidad por default que puse en BasicScreen para cada pantalla que tenga el boton "volver".
     * Hago esto, en este metodo porque el boton "volver" lo que hace cuando es presionado es llamar a este metodo.
     */
    public boolean onClose() {
	UiApplication.getUiApplication().popScreen(this);
	UiApplication.getUiApplication().pushScreen(new MainMenuScreen());
	return false;
    }

}
